package com.javacoo.swing.jxbrowser.content;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.WindowConstants;

import com.javacoo.swing.jxbrowser.BaseBrowser;
import com.teamdev.jxbrowser.chromium.BeforeSendHeadersParams;
import com.teamdev.jxbrowser.chromium.BeforeURLRequestParams;
import com.teamdev.jxbrowser.chromium.Browser;
import com.teamdev.jxbrowser.chromium.BrowserContext;
import com.teamdev.jxbrowser.chromium.HttpHeaders;
import com.teamdev.jxbrowser.chromium.swing.BrowserView;
import com.teamdev.jxbrowser.chromium.swing.DefaultNetworkDelegate;

/**
 * 网络活动
 * <li></li>
 * JxBrowser提供允许处理网络活动的功能，包括HTTP请求/响应。您可以使用NetworkDelegate处理与指定BrowserContext关联的Browser实例的所有网络活动。
 *
 * 使用NetworkDelegate，您可以拦截所有HTTP请求/响应标头，并获取有关每个请求/响应阶段的信息。以下是所有请求/响应阶段的列表：
 * onBeforeRequest -可以修改数据
 *
 * 请求即将发生时触发。此事件在建立任何TCP连接之前发送，并可用于将请求重定向到另一个位置。当方法类型为“POST”时，它可用于访问和修改请求的POST数据。见例子。
 * onBeforeSendHeaders
 *
 * 即将发出请求并且已准备好初始标头时触发。它允许添加，修改和删除HTTP请求标头
 * onBeforeSendProxyHeaders
 *
 * 使用代理连接时onBeforeSendHeaders之后触发。提供有关代理连接的信息，并允许添加，修改和删除HTTP请求标头。
 * onSendHeaders
 *
 * 在HTTP标头发送到网络之前触发。此事件是信息性的，不允许修改HTTP标头。
 * onHeadersReceived
 *
 * 每次收到HTTP（S）响应头时触发。由于重定向和身份验证请求，每次请求可能会多次发生这种情况。此事件旨在允许添加，修改和删除HTTP响应标头，例如传入的Set-Cookie标头。
 * onAuthRequired
 *
 * 当请求收到身份验证质询但无法使用缓存凭据进行响应时触发。您可以使用此方法来处理“基本”或“摘要”身份验证。
 * onBeforeRedirect
 *
 * 即将发出请求并且已准备好初始标头时触发。它允许添加，修改和删除HTTP请求标头。
 * onResponseStarted
 *
 * 收到响应正文的第一个字节时触发。对于HTTP请求，这意味着状态行和响应头可用。此事件是信息性的。
 * onCompleted
 *
 * 成功处理请求或失败时触发。
 * onDestroyed
 *
 * 在请求被销毁时触发。
 * onCanSetCookies
 *
 * 当引擎即将决定是否可以设置指定的cookie时触发。
 * onCanGetCookies
 *
 * 当引擎即将决定是否可以接收指定的cookie并发送到Web服务器时触发。
 *
 * 以下示例演示了如何使用onBeforeURLRequest事件更改目标URL，并在用户加载www.google.com时打印User-Agent HTTP标头值
 * @author: duanyong@jccfc.com
 * @since: 2020/9/25 9:59
 */
public class NetworkEvents extends BaseBrowser {
    public static void main(String[] args) {

        BrowserContext browserContext = BrowserContext.defaultContext();
        browserContext.getNetworkService().setNetworkDelegate(new DefaultNetworkDelegate() {
            @Override
            public void onBeforeURLRequest(BeforeURLRequestParams params) {
                // If navigate to teamdev.com, then change URL to google.com.
                if (params.getURL().equals("https://gitee.com")) {
                    params.setURL("www.baidu.com");
                }
            }

            @Override
            public void onBeforeSendHeaders(BeforeSendHeadersParams params) {
                // If navigate to google.com, then print User-Agent header value.
                if (params.getURL().equals(BASE_URL)) {
                    HttpHeaders headers = params.getHeaders();
                    System.out.println("User-Agent: " + headers.getHeader("User-Agent"));
                }
            }
        });
        Browser browser = new Browser(browserContext);
        BrowserView browserView = new BrowserView(browser);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(browserView, BorderLayout.CENTER);
        frame.setSize(700, 500);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);



        browser.loadURL(BASE_URL);
    }
}
